package com.atguigu.tingshu.search.listener;

import com.atguigu.tingshu.search.service.impl.ItemServiceImpl;
import org.redisson.api.RBloomFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplicationRunListener;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;

/**
 * Author:huzhongkui
 * Date: 2025-03-24 星期一 16:24:04
 * Description: 利用springBoot的监听器机制完成对分布式布隆数据的同步
 */
//@Component  // --扫描机制 spi机制 手动放进去 listener一定要用spi机制  项目最终的选择

public class BloomFilterListener implements SpringApplicationRunListener {


    Logger logger = LoggerFactory.getLogger(this.getClass());


    /**
     * 该方法springboot在启动过程（就包含了spring容器中应用定义的Bean对象都创建完毕）中回调
     *
     * @param context   the application context.
     * @param timeTaken the time taken to start the application or {@code null} if unknown
     *                  <p>
     *                  started方法在容器启动的过程中调用两次。
     *                  第一次是springcloud的组件调用的。  ConfigurableApplicationContext spring容器里面是没有应用中定义好的Bean对象
     *                  第二次是springboot组件调用的。  ConfigurableApplicationContext spring容器里面才有应用中定义好的Bean对象
     */
    @Override
    public void started(ConfigurableApplicationContext context, Duration timeTaken) {


        boolean containsBean = context.containsBean("rBloomFilter");
        if (containsBean) {
            // 1.从spring容器中获取到布隆过滤器的Bean对象
            RBloomFilter rBloomFilter = context.getBean("rBloomFilter", RBloomFilter.class);


            if (rBloomFilter.count() == 0) {
                // 2.从spring容器中获取应用的Bean对象
                ItemServiceImpl itemServiceImpl = context.getBean("itemServiceImpl", ItemServiceImpl.class);

                // 3.获取数据
                List<Long> albumInfoIdList = itemServiceImpl.getAlbumInfoIdList();

                // 4.将数据放到布隆过滤器中
                for (Long albumId : albumInfoIdList) {
                    rBloomFilter.add(albumId);
                }
                // 5.布隆过滤器元素是否同步进去
                logger.info("分布式布隆过滤器的元素个数：" + rBloomFilter.count());
            }

        }

    }
}
